// **********************************************************************
//  
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//  
// You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>
//  
// ************************************************************************

//convierte los jid en cadenas para usarlos como ids de html
function html_id(jid) {
  return Strophe.getBareJidFromJid(jid).replace(".", "_").replace("@", "_");
}

function scroll_chat (jid) {
  var jid_id = html_id(jid)
  var div = $('#chat_' + jid_id + ' .ventana_chat').get(0);
  //TODO comprobar que existe div
  div.scrollTop = div.scrollHeight;
}

function nueva_pestana(jid, nombre){
  var jid_id = html_id(jid);
  $('#pizarra_chat').tabs('add', '#chat_' + jid_id, jid);
  $('#chat_' + jid_id).append("<div class='ventana_chat'></div><input type='text' class='entrada_chat'>");
  $('#chat_' + jid_id).data('jid', jid);//jid dueño
}

function focus_pestana(jid){
  var jid_id = html_id(jid);
  $('#pizarra_chat').tabs('select', '#chat_' + jid_id);
  $('#chat_' + jid_id + ' input').focus();
}

//esto esta fatal, tengo traumas con los temporizadores
function estado_chat(obj, jid, active, composing, paused){
  //si estaba en composing y pasa al estado composing
  if (obj.data('composing') && composing) {
    //alert('1');
    //resetea el temporizador
    clearTimeout(obj.data('temporizador'));
    var str = 'Jabber.enviar_mensaje(\'' + jid + '\', \'\', \'paused\');';
    //obj.data('temporizador', setTimeout(str, 3000));
  } else if (paused){
    //alert('2');
  } else if (composing) {
    //alert('3');
    //estado = composing y aranca el temporizador
    Jabber.enviar_mensaje(jid,'', 'composing');
    clearTimeout(obj.data('temporizador'));
    var str = 'Jabber.enviar_mensaje(\'' + jid + '\', \'\', \'paused\');' +
	      'estado_chat(' + jid + ',' + jid + ',' + false + ',' + false + ',' + true + ');';
    //alert(str);

    //obj.data('temporizador', setTimeout(str, 3000));
  } else if (active) {
    //alert('4');
    clearTimeout(obj.data('temporizador'));
  } else {
    //alert('5');
  }
  //actualiza el estado
  obj.data('active', active);
  obj.data('composing', composing);
  obj.data('paused', paused);
}

$(document).ready(function () {

  $('#dialogo_conectando').dialog({
    autoOpen: false,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Conectando',
    buttons: {
      "Cancelar": function () {
	Jabber.desconectar();
	$(document).trigger('desconectado');
	$(this).dialog('close');
	$('#dialogo_acceso').dialog('open');
      }
    }
  });

  $('#dialogo_autentificando').dialog({
    autoOpen: false,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Autentificando',
    /*buttons: {
      "Cancelar": function () {
		Jabber.desconectar();
		$(document).trigger('desconectado');
		$(this).dialog('close');
		$('#dialogo_acceso').dialog('open');
      }
    }*/
  });

  $('#dialogo_error_autentificacion').dialog({
    autoOpen: false,
    draggable: true,
    modal: true,
    resizable: false,
    title: 'Error de autentificacion',
    buttons: {
      "Aceptar": function () {
	//$(document).trigger('desconectado');
	$(this).dialog('close');
	$('#dialogo_acceso').dialog('open');
      }
    }
  });

  $('#dialogo_desconectando').dialog({
    autoOpen: false,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Desconectando'
  });

  $('#dialogo_error_conexion').dialog({
    autoOpen: false,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Error de conexion',
    buttons: {
      "Aceptar": function () {
	//$(document).trigger('desconectado');
	$(this).dialog('close');
	$('#dialogo_acceso').dialog('open');
      }
    }
  });

  $('#dialogo_error_desconocido').dialog({
    autoOpen: false,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Error desconocido',
    buttons: {
      "Aceptar": function () {
	//$(document).trigger('desconectado');
	$(this).dialog('close');
	$('#dialogo_acceso').dialog('open');
      }
    }
  });

  $('#dialogo_acceso').dialog({
    autoOpen: true,
    draggable: false,
    modal: true,
    resizable: false,
    title: 'Conectar',
    buttons: {
      "Conectar": function () {
	if ($('#jid_usuario').val().length > 0 && $('#password').val().length > 0) {
	  $(document).trigger('conectar', { jid: $('#jid_usuario').val(), password: $('#password').val() });
	  $('#password').val('');
	  $(this).dialog('close');
	}
      }
    }
  });

  $('#dialogo_nuevo_contacto').dialog({
    autoOpen: false,
    draggable: true,
    modal: true,
    resizable: false,
    title: 'Nuevo contacto',
    buttons: {
      "Agregar": function () {
	//if($('#jid_contacto_agregar').val().length > 0 & $('#nombre_local_contacto').val() > 0){
	if(true){
	  Jabber.agregar_contacto({ jid: $('#jid_contacto_agregar').val(), name: $('#nombre_local_contacto').val() });
	  Jabber.agregar_suscripcion($('#jid_contacto_agregar').val());
	  $('#jid_contacto_agregar').val('');
	  $('#nombre_local_contacto').val('');
	  $(this).dialog('close');
	}
      }
    }
  });

  $('#dialogo_eliminar_contacto').dialog({
    autoOpen: false,
    draggable: true,
    modal: true,
    resizable: false,
    title: 'Eliminar contacto',
    buttons: {
      "Eliminar": function () {
	//if($('#jid_contacto_eliminar').val().length > 0){
	if(true){
	  Jabber.eliminar_suscripcion($('#jid_contacto_eliminar').val());
	  //Jabber.eliminar_contacto($('#jid_contacto_eliminar').val());
	  $('#jid_contacto_eliminar').val('');
	  $(this).dialog('close');
	}
      }
    }
  });

  $('#dialogo_aprobar_presencia').dialog({
    autoOpen: false,
    draggable: true,
    modal: true,
    resizable: false,
    title: 'Peticion de suscripcion',
    buttons: {
      "Aprobar": function () {
	Jabber.conexion.gestion_roster.aceptar_suscripcion($('#jid_pendiente_aprobacion').text());
	//Jabber.conexion.gestion_roster.suscribir(Jabber.suscripcion_pendiente);
	//Jabber.conexion.send($pres({to: Jabber.peticion_suscripcion,"type": "subscribed"}));
	//Jabber.conexion.send($pres({to: Jabber.peticion_suscripcion,"type": "subscribe"}));
	//Jabber.peticion_suscripcion = null;
	Jabber.suscripcion_pendiente = null;
	$(this).dialog('close');
      },

      "Denegar": function () {
	Jabber.bloquear_contacto(Jabber.suscripcion_pendiente);
	Jabber.suscripcion_pendiente = null;
	$(this).dialog('close');
      }
    }
  });

  $('formulario_acceso').submit(function(){ return false;}); //no va
  //$('#selector_temas').themeswitcher();
  $('button').button();//todos los botones son botones, no podría ser de otra manera.
  $('#boton_agregar_contacto').button({disabled: true});
  $('#boton_eliminar_contacto').button({disabled: true});
  $('#boton_bloquear_contacto').button({disabled: true});
  $('#boton_desconectar').button({disabled: true});
  $('#boton_nube_palabras').button({disabled: true});
  $('#boton_historial').button({disabled: true});

  $('#boton_conectar').click(function (ev) {
    $('#dialogo_acceso').dialog('open');
  });

  $('#boton_agregar_contacto').click(function (ev) {
      $('#dialogo_nuevo_contacto').dialog('open');
  });

  $('#boton_eliminar_contacto').click(function (ev) {
      $('#dialogo_eliminar_contacto').dialog('open');
  });

  $('#boton_desconectar').click(function (ev) {
      Jabber.desconectar();
      //$(document).trigger('desconectado');
  });
//
  $('#boton_nube_palabras').click(function (ev) {
      //alert("nube");
      
      var opciones = "";
      opciones += 'width='+screen.width;
      opciones += ', height='+screen.height;
      opciones += ', top=0, left=0'
      opciones += ', fullscreen=yes';
      opciones += ',scrollbars=yes';

      var nuevaVentana = window.open("../cgi-bin/nube_palabras_v2.pl?sc=" + escape(Strophe.getNodeFromJid(Jabber.conexion.jid)), 'Nube de Palabras', opciones);
      
      if (window.focus) {
        nuevaVentana.focus()
      }
  });
  
  $('#boton_historial').click(function (ev) {
      //alert("historial");
      
      var opciones = "";
      opciones += 'width='+screen.width;
      opciones += ', height='+screen.height;
      opciones += ', top=0, left=0'
      opciones += ', fullscreen=yes';
      opciones += ',scrollbars=yes';

      var nuevaVentana = window.open("../cgi-bin/historiales_v2.pl?sc=" + escape(Strophe.getNodeFromJid(Jabber.conexion.jid)), 'Historiales', opciones);
      
      if (window.focus) {
        nuevaVentana.focus()
      }
  });
//
  $('#pizarra_chat').tabs().find('.ui-tabs-nav').sortable({axis: 'x'});
  $('#pizarra_chat').tabs({
    closable: true,
    remove: function (ev, ui){
      //no funciona porque en este punto ya se ha borrado el .data('jid')
    }
  });
  $('#pizarra_chat').tabs()
  $('#pizarra_chat').resizable({
    resize: function(event, ui) {
      //TODO recolocacion correcta de los elementos.
    }
  });

  $(document).bind('nueva_pestana', function (ev, datos){
    nueva_pestana(datos.jid, datos.nombre);
  });

  //al hacer click en un contacto de la lista
  $('.contacto').live('click', function () {
    var jid = $(this).find(".jid_roster").text();
    var name = $(this).find(".apodo_roster").text();
    var jid_id = html_id(jid);
    var clase = $(this).attr("class");
    if ($('#chat_' + jid_id).length === 0 && clase.indexOf("offline") == -1) {
      nueva_pestana(jid, name);
    }
    focus_pestana(jid);
  });

//http://xmpp.org/extensions/xep-0085.html
//XEP-0085: Chat State Notifications
//evento de teclado del textbox
  $('.entrada_chat').live('keypress', function (ev) {
    var jid = $(this).parent().data('jid');
    var mensaje = $(this).val();
    //si se pulsa intro se manda el mensaje y se maldice a los navegadores
    if (ev.which === 13 | ev.keyCode == 13) {
      ev.preventDefault();
      if (mensaje.length > 0) {
	Jabber.enviar_mensaje(jid, mensaje, 'active');
        
        if (jid != Strophe.getNodeFromJid(Jabber.conexion.jid)) {
          Log.save_log(jid, mensaje, Strophe.getNodeFromJid(Jabber.conexion.jid), Strophe.getNodeFromJid(Jabber.conexion.jid));
        } 
        
	$(document).trigger('nuevo_mensaje', {mensaje: mensaje, jid: jid, nombre: Strophe.getNodeFromJid(Jabber.conexion.jid)});
	//scroll_chat(jid);
	$(this).val('');
	estado_chat($(this).parent(), jid, true, false, false);
      }
    //si no ha pulsado intro entonces esta escribiendo un mensaje
    //(vale, esto es cutre, f5 no es escribir un mensaje)
    //pasa a modo composing si no lo estaba
    } else {
      estado_chat($(this).parent(), jid,  false, true, false);
    }
    //si esta en composing, como se han pulsado teclas,
    //se resetea el temporizador
    //if ($(this).parent().data('paused')) {
	    //clearTimeout($(this).parent().data('temporizador'));
	    //var str = 'Jabber.enviar_mensaje2(\'' + jid + '\', \'\', \'paused\');';
	    //$(this).parent().data('temporizador', setTimeout(str, 3000));
    //}
  });
});

  $(document).bind('nuevo_mensaje', function (ev, datos){
    var jid_id = html_id(datos.jid);
    //si no habia una pestaña se crea
    if ($('#chat_' + jid_id).length === 0) {
      //el segundo parametro deberia ser el nombre del roster
      nueva_pestana(datos.jid, datos.jid);
    }
    //$('#chat_' + jid_id).data('jid', full_jid); //mirar
    //$('#chat_' + jid_id + ' input').focus(); //si estas en otra pestaña, esa pierde el focus?

    var estilo;
    if (datos.nombre === Strophe.getNodeFromJid(Jabber.conexion.jid)){
      estilo = 'apodo_propio';
    } else {
      estilo = 'apodo';
    }
    $('#chat_' + jid_id).find('.ventana_chat').append(
      "<div class='mensaje_chat'>&lt;" +
      "<span class='" + estilo + "'>" + datos.nombre +
      "</span>&gt; <span class='cuerpo_mensaje'>" +
      htmlentities(datos.mensaje) +
      "</span></div>"
    );
    scroll_chat(datos.jid);
    
    if (datos.nombre != Strophe.getNodeFromJid(Jabber.conexion.jid)) {
      Log.save_log(datos.nombre, datos.mensaje, datos.nombre, Strophe.getNodeFromJid(Jabber.conexion.jid));
    }
  });

  $(document).bind('conectar', function (ev, credenciales) {
    $('#dialogo_conectando').dialog('open');
    Jabber.conectar(credenciales);
  });

  $(document).bind('autentificando', function(ev){
    $('#dialogo_conectando').dialog('close');
    $('#dialogo_autentificando').dialog('open');
  });

  $(document).bind('error_autentificacion', function(ev){
    $('#dialogo_conectando').dialog('close');
    $('#dialogo_error_autentificacion').dialog('open');
  });

  $(document).bind('conectando', function(ev){
    $('#dialogo_conectando').dialog('open');
  });

  $(document).bind('conectado', function (ev){
    $('#boton_conectar').button({disabled: true});

    $('#boton_agregar_contacto').button({disabled: false});
    $('#boton_eliminar_contacto').button({disabled: false});
    $('#boton_bloquear_contacto').button({disabled: false});
    $('#boton_desconectar').button({disabled: false});
    $('#boton_nube_palabras').button({disabled: false});
    $('#boton_historial').button({disabled: false});
    $('#dialogo_autentificando').dialog('close');
  });

  $(document).bind('error_conexion', function (ev){
    $('#dialogo_error_conexion').dialog('open');
  });

  $(document).bind('desconectando', function (ev) {
    $('#dialogo_desconectando').dialog('open');
  });

  $(document).bind('desconectado', function (ev) {
    //un fregadillo
    $('#lista_contactos ul').empty();
    $('#pizarra_chat ul').empty();
    $('#pizarra_chat div').remove();
    $('#boton_conectar').button({disabled: false});
    $('#boton_agregar_contacto').button({disabled: true});
    $('#boton_eliminar_contacto').button({disabled: true});
    $('#boton_bloquear_contacto').button({disabled: true});
    $('#boton_desconectar').button({disabled: true});
    $('#boton_nube_palabras').button({disabled: true});
    $('#boton_historial').button({disabled: true});
    $('#dialogo_desconectando').dialog('close');
    $('#dialogo_acceso').dialog('open');
  });

  $(document).bind('error_desconocido', function (ev){
    $('#dialogo_error_desconocido').dialog('open');
  });

  $(document).bind('insertar_contacto_roster', function(ev, contacto){
    var jid_id = html_id(contacto.jid);
    var contacto = "<li id='" + jid_id + "'>" +
			  "<div class='" + ($('#' + jid_id).attr('class') || "contacto offline") + "'>" +
			    "<div class='apodo_roster'>" + contacto.nombre + "</div>"+
			    "<div class='jid_roster'>" + contacto.jid + "</div>" +
			  "</div>"+
		    "</li>";
    if ($('#' + jid_id).length > 0) {
      $('#' + jid_id).replaceWith(contacto);
    } else {
      $('#lista_contactos ul').append(contacto);
    }
  });

  $(document).bind('eliminar_contacto', function(ev, jid){
    $('#' + html_id(jid)).remove();
  });

  $(document).bind('actualizar_presencia', function(ev, datos){
    var jid_id = html_id(datos.jid);
    var contact = $('#lista_contactos li#' + jid_id + ' .contacto')
	    .removeClass("online")
	    .removeClass("away")
	    .removeClass("offline")
	    .addClass(datos.presencia);
  });
